{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Machine Translation Explanations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook demonstrates model explanations for a text to text scenario using a pretrained transformer model for machine translation. In this demo, we showcase explanations on two different models: English to Spanish (https://huggingface.co/Helsinki-NLP/opus-mt-en-es), and English to French (https://huggingface.co/Helsinki-NLP/opus-mt-en-fr)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": false }, "outputs": [], "source": [ "from transformers import AutoModelForSeq2SeqLM, AutoTokenizer\n", "\n", "import shap" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## English to Spanish model" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# load the model and tokenizer\n", "tokenizer = AutoTokenizer.from_pretrained(\"Helsinki-NLP/opus-mt-en-es\")\n", "model = AutoModelForSeq2SeqLM.from_pretrained(\"Helsinki-NLP/opus-mt-en-es\").cuda()\n", "\n", "# define the input sentences we want to translate\n", "data = [\n", " \"Transformers have rapidly become the model of choice for NLP problems, replacing older recurrent neural network models\"\n", "]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Explain the model's predictions" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "floor_divide is deprecated, and will be removed in a future version of pytorch. It currently rounds toward 0 (like the 'trunc' function NOT 'floor'). This results in incorrect rounding for negative values.\n", "To keep the current behavior, use torch.div(a, b, rounding_mode='trunc'), or for actual floor division, use torch.div(a, b, rounding_mode='floor'). (Triggered internally at /pytorch/aten/src/ATen/native/BinaryOps.cpp:467.)\n" ] } ], "source": [ "# we build an explainer by passing the model we want to explain and\n", "# the tokenizer we want to use to break up the input strings\n", "explainer = shap.Explainer(model, tokenizer)\n", "\n", "# explainers are callable, just like models\n", "shap_values = explainer(data, fixed_context=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Visualize shap explanations" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "
\n", "
[0]
\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "
outputs
\n", "
Los
\n", "
transformador
\n", "
es
\n", "
se
\n", "
han
\n", "
convertido
\n", "
rápidamente
\n", "
en
\n", "
el
\n", "
modelo
\n", "
de
\n", "
elección
\n", "
para
\n", "
problemas
\n", "
N
\n", "
LP
\n", "
,
\n", "
reemplaza
\n", "
ndo
\n", "
modelos
\n", "
de
\n", "
red
\n", "
neuro
\n", "
nal
\n", "
recurrente
\n", "
s
\n", "
más
\n", "
antiguos


-0-1010-7.50297-7.50297base value0.7807650.780765fLos(inputs)5.114 ers 1.965 ▁Transform 1.903 ▁have 0.325 ▁of 0.186 ▁become 0.172 ▁neural 0.105 ▁network 0.101 ▁the 0.081 ▁for 0.053 ▁replacing 0.05 ▁recurrent 0.025 ▁older 0.021 LP -0.505 ▁rapidly -0.417 , -0.247 ▁problems -0.225 ▁model -0.114 ▁choice -0.114 ▁models -0.1 -0.096 ▁N
inputs
1.965
▁Transform
5.114
ers
1.903
▁have
-0.505
▁rapidly
0.186
▁become
0.101
▁the
-0.225
▁model
0.325
▁of
-0.114
▁choice
0.081
▁for
-0.096
▁N
0.021
LP
-0.247
▁problems
-0.417
,
0.053
▁replacing
0.025
▁older
0.05
▁recurrent
0.172
▁neural
0.105
▁network
-0.114
▁models
-0.1